package JMM.Volatile;

import java.util.concurrent.atomic.AtomicInteger;

public class VolatileTest01 {
//    volatile int i;
//
//    public void addI(){
//        i++;
//    }

    /**
    * 使用 synchronized 关键字保证操作的原子性
    * */
//    public synchronized void addI(){
//        i++;
//    }

    /**
     * 使用java.util.concurrent.atomic.AtomicInteger 类来保证操作的原子性
    * */
    private AtomicInteger i = new AtomicInteger(0);

    public void addI(){
        i.incrementAndGet(); // 原子性地增加1
    }


    public static void main(String[] args) throws InterruptedException {
        final  VolatileTest01 test01 = new VolatileTest01();
        for (int n = 0; n < 1000; n++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    test01.addI();
                }
            }).start();
        }
        Thread.sleep(500);//等待10秒，保证上面程序执行完成
        System.out.println(test01.i);
    }
}
